home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / mac / files / t_sys5 / unixcpio.gz / unixnet.cpio / icmpdump.c < prev    next >
C/C++ Source or Header  |  1994-07-11  |  2KB  |  79 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "internet.h"
  5. #include "icmp.h"
  6. #include "trace.h"
  7.  
  8. extern FILE *trfp;
  9.  
  10. /* Dump an ICMP header */
  11. /*ARGSUSED*/
  12. void
  13. icmp_dump(bpp,source,dest,check)
  14. struct mbuf **bpp;
  15. int32 source,dest;
  16. int check;        /* If 0, bypass checksum verify */
  17. {
  18.     struct icmp icmp;
  19.     int16 csum;
  20.  
  21.     if(bpp == NULLBUFP || *bpp == NULLBUF)
  22.         return;
  23.     csum = cksum(NULLHEADER,*bpp,len_mbuf(*bpp));
  24.     
  25.     ntohicmp(&icmp,bpp);
  26.     
  27.     if(uchar(icmp.type) <= 16 && icmptypes[uchar(icmp.type)] != NULLCHAR)
  28.         fprintf(trfp,"ICMP: %s",icmptypes[uchar(icmp.type)]);
  29.     else
  30.         fprintf(trfp,"ICMP: type %u",uchar(icmp.type));
  31.  
  32.     switch(uchar(icmp.type)){
  33.     case DEST_UNREACH:
  34.         if(uchar(icmp.code) <= 5)
  35.             fprintf(trfp," %s",unreach[uchar(icmp.code)]);
  36.         else
  37.             fprintf(trfp," code %u",uchar(icmp.code));
  38.         break;
  39.     case REDIRECT:
  40.         if(uchar(icmp.code) <= 3)
  41.             fprintf(trfp," %s",redirect[uchar(icmp.code)]);
  42.         else
  43.             fprintf(trfp," code %u",uchar(icmp.code));
  44.         break;
  45.     case TIME_EXCEED:
  46.         if(uchar(icmp.code) <= 1)
  47.             fprintf(trfp," %s",exceed[uchar(icmp.code)]);
  48.         else
  49.             fprintf(trfp," code %u",uchar(icmp.code));
  50.         break;
  51.     case PARAM_PROB:
  52.         fprintf(trfp," pointer = %u",icmp.args.pointer);
  53.         break;
  54.     case ECHO:
  55.     case ECHO_REPLY:
  56.     case INFO_RQST:
  57.     case INFO_REPLY:
  58.     case TIMESTAMP:
  59.     case TIME_REPLY:
  60.         fprintf(trfp," id %u seq %u",icmp.args.echo.id,icmp.args.echo.seq);
  61.         break;
  62.     }
  63.     if(check && csum != 0){
  64.         fprintf(trfp," CHECKSUM ERROR (%u)",csum);
  65.     }
  66.     fprintf(trfp,"\n");
  67.     /* Dump the offending IP header, if any */
  68.     switch(icmp.type){
  69.     case DEST_UNREACH:
  70.     case TIME_EXCEED:
  71.     case PARAM_PROB:
  72.     case QUENCH:
  73.     case REDIRECT:
  74.         fprintf(trfp,"Returned ");
  75.         ip_dump(bpp,0);
  76.     }
  77. }
  78.  
  79.